package com.feicheng.house.service.impl;

import com.feicheng.house.entity.User;

import com.feicheng.house.mapper.UserMapper;
import com.feicheng.house.service.IUserService;
import com.feicheng.house.entity.Permission;
import com.feicheng.house.entity.Role;
import com.feicheng.house.entity.RolePermission;
import com.feicheng.house.entity.UserRole;
import com.feicheng.house.result.ResultInfo;
import com.feicheng.house.service.IPermissionService;
import com.feicheng.house.service.IRolePermissionService;
import com.feicheng.house.service.IRoleService;
import com.feicheng.house.service.IUserRoleService;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author feichengTech
 * @since 2021-10-30
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {


	@Autowired
	IRoleService iRoleService;
	
	@Autowired
	IPermissionService iPermissionService;

	@Autowired
	IUserRoleService iUserRoleService;
	
	@Autowired
	IRolePermissionService iRolePermissionService;
	
	@Autowired
	HttpSession session;
	

	@Override
	public ResultInfo selectUser(
			Integer currentPage, 
			Integer pageSize, 
			String account, 
			String tel, 
			String secId) {

		// 如果没输入当前页当前页就是“1”
		//現在のページが入力されていない場合、現在のページは1
		if (null == currentPage) {
			currentPage = 1;
		}

		// 如果没输入查询多少条就默认10条
		// クエリするエントリの数が入力されていない場合、数は10
		if (null == pageSize) {
			pageSize = 10;
		}
		// 构建查询条件
		// QueryWrapperオブジェクトを作成する
		QueryWrapper<User> userWrapper = new QueryWrapper<User>();
		// 如果账号不是空或空字符串，就把账号加入查询的条件中
		// アカウントはNULLまたは空の文字列ではないの場合、アカウントをクエリの条件に追加する
		if (StringUtils.hasLength(account)) {
			userWrapper.like("account", account);
		}
		// 如果电话号码不是空把电话号码加入到查询的条件中
		// 電話番号がNULLまたは空の文字列ではないの場合、電話番号をクエリの条件に追加する
		if (StringUtils.hasLength(tel)) {
			userWrapper.like("tel", tel);
		}
		// 如果身份证号码不是空把身份证号码加入到查询条件中
		// IDナンバーがNULLまたは空の文字列ではないの場合、IDナンバーをクエリの条件に追加する
		if (StringUtils.hasLength(secId)) {
			userWrapper.like("sec_id", secId);
		}
		
		// 创建分页查询
		// ページ付けクエリを作成する
		IPage<User> pageInfo = new Page<User>(currentPage, pageSize);
		// 返回查询结果
		// クエリ結果を返す
		return ResultInfo.success(this.page(pageInfo, userWrapper));
	}
    

	@Override
	public ResultInfo selectUserById(Integer userId) {
		

		User user = this.getById(userId);
		
		//得到所有关联的UserRole
		//すべての関連するのUserRoleを取得する
		QueryWrapper<UserRole> userRoleWrapper = new QueryWrapper<UserRole>();
		userRoleWrapper.eq("user_id", userId);
		List<UserRole> userRoles = iUserRoleService.list(userRoleWrapper);
		//roleIds为存放关联Role Id的List
		//roleIdsは、関連するのRole Idを保存するList
		List<Integer> roleIds = new ArrayList<Integer>();
		for (UserRole ur : userRoles) {
			roleIds.add(ur.getRoleId());
		}
		
		//得到所有的关联的RolePermission
		//すべての関連するのRolePermissionを取得する
		QueryWrapper<RolePermission> rolePermissionWrapper = 
				new QueryWrapper<RolePermission>();
		rolePermissionWrapper.in("role_id", roleIds);
		List<RolePermission> rolePermissions = 
				iRolePermissionService.list(rolePermissionWrapper);
		//permissionIds为存放关联Permission Id的List
		//permissionIdsは、関連するのPermission Idを保存するList
		List<Integer> permissionIds = new ArrayList<Integer>();
		for (RolePermission rp : rolePermissions) {
			permissionIds.add(rp.getPermissionId());
		}
		
		//根据roleIds得到所有关联的Role
		//roleIdsに基づいて、関連するすべてのRoleを取得する
		QueryWrapper<Role> roleWrapper = new QueryWrapper<Role>();
		roleWrapper.in("role_id", roleIds);
		List<Role> roles = iRoleService.list(roleWrapper);
		
		//根据permissionIds得到所有关联的Permission
		// permissionIdsに基づいて、関連するすべてのPermissionを取得する
		QueryWrapper<Permission> permissionWrapper = new QueryWrapper<Permission>();
		if (!permissionIds.isEmpty()) {
			permissionWrapper.in("permission_id", permissionIds);
		}
		//按照父级权限ID正序排序
		//親パーミッションのID基づいて正順にソート
		permissionWrapper.orderByAsc("p_id");
		List<Permission> permissions = iPermissionService.list(permissionWrapper);

		JSONObject result = new JSONObject();
		result.put("user", user);
		result.put("roles", roles);
		result.put("permissions", permissions);
		
		return ResultInfo.success(result);
	}


	@Override
	public ResultInfo addUser(User user, String roles) {


		// 在session中获取userId
		//セッションオブジェクトからユーザーIDを取得する
		JSONObject current = (JSONObject) session.getAttribute("CURRENT");
		int currentUserId = 0;
		if (current != null) {
			User currentUser = (User) current.get("user");
			currentUserId = currentUser.getUserId();
		}

		
		user.setOpenId("1");
		user.setCu(currentUserId);
		user.setUu(currentUserId);
		user.setCt(LocalDateTime.now());
		user.setUt(LocalDateTime.now());
		this.save(user);

		//添加user与role的关联
		//userとroleの関連付けを追加する
		JSONArray rolesIdArray = JSONArray.parseArray(roles);
		List<UserRole> roleList = new ArrayList<UserRole>();
		for (int i = 0; i < rolesIdArray.size(); i++) {
			Integer roleId = Integer.parseInt((String) rolesIdArray.get(i));
			UserRole userRole = new UserRole();
			userRole.setUserId(user.getUserId());
			userRole.setRoleId(roleId);
			roleList.add(userRole);
		}

		iUserRoleService.saveBatch(roleList);
		return ResultInfo.success(user);
	}


	@Override
	public ResultInfo updateUser(User user, String roles) {
		

		
		// 在session中获取userId
		//セッションオブジェクトからユーザーIDを取得する
		JSONObject current = (JSONObject) session.getAttribute("CURRENT");
		int currentUserId = 0;
		if (current != null) {
			User currentUser = (User) current.get("user");
			currentUserId = currentUser.getUserId();
		}
		user.setUu(currentUserId);
		user.setUt(LocalDateTime.now());
		// 修改用户信息
		// ユーザーデータを更新する
		this.updateById(user);
		// 通过userId删除user和role的关联
		//userIdに基づいてuserとroleの関連付けを解除する
		
		
		if (StringUtils.hasLength(roles)) {
			//先删除所有的关联
			//まずすべての関連付けを解除する
			QueryWrapper<UserRole> removeWrapper = new QueryWrapper<UserRole>();
			removeWrapper.eq("user_id", user.getUserId());
			iUserRoleService.remove(removeWrapper);

			// 新增user与role的关联
			//userとroleの関連付けを追加する
			JSONArray rolesIdArray = JSONArray.parseArray(roles);
			List<UserRole> roleList = new ArrayList<UserRole>();
			for (int i = 0; i < rolesIdArray.size(); i++) {
				Integer roleId = (Integer) rolesIdArray.get(i);
				UserRole userRole = new UserRole();
				userRole.setUserId(user.getUserId());
				userRole.setRoleId(roleId);
				roleList.add(userRole);
			}
			iUserRoleService.saveBatch(roleList);
		}

		return ResultInfo.success(user);
	}
}
